package base_util

import (
	"go-likaladi-shop/common/base_global"
	"gorm.io/gorm"
)

// Paginate 分页函数，返回一个 GORM 查询作用域
func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		// 如果页码为 0，默认设置为 1
		if page == 0 {
			page = 1
		}

		// 设置每页最大条数为 100，防止查询过多数据
		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}

		// 计算分页的偏移量
		offset := (page - 1) * pageSize

		// 返回带有分页设置的 GORM 查询
		return db.Offset(offset).Limit(pageSize)
	}
}

func QueryByIds(ids []int32, dbModel interface{}) error {
	// 定义用于存储数据库查询结果的实体切片
	// 使用 GORM 的 IN 查询语法，根据 ID 列表批量查询品牌信息
	if err := base_global.DB.Where("id IN ?", ids).Find(dbModel).Error; err != nil {
		// 查询出错时，使用封装的 gRPC 错误处理函数返回错误
		return GrpcError(err)
	}
	return nil
}

func QueryByIds2(ids []int32, dbModel interface{}) error {
	// 定义用于存储数据库查询结果的实体切片
	// 使用 GORM 的 IN 查询语法，根据 ID 列表批量查询品牌信息
	if err := base_global.DB.Where(ids).Find(dbModel).Error; err != nil {
		// 查询出错时，使用封装的 gRPC 错误处理函数返回错误
		return GrpcError(err)
	}
	return nil
}

/* 提供给外部使用的，方法要首字母大写 */
func CreateTable(dbModel interface{}) {
	// 自动迁移（AutoMigrate）gin_model.User 结构体对应的数据库表结构
	// 这会根据 gin_model.User 的结构自动创建或更新数据库表，不会删除已有数据
	_ = base_global.DB.AutoMigrate(dbModel)
}
